home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / gtlayout-source.lha / LTP_Spread.c < prev    next >
C/C++ Source or Header  |  1996-03-18  |  3KB  |  167 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. VOID
  15. LTP_Spread(LayoutHandle *Handle,ObjectNode *Group,LONG Width,LONG Height)
  16. {
  17.     ObjectNode    *Node;
  18.     LONG         Count;
  19.  
  20.     Count = 0;
  21.  
  22.     SCANGROUP(Group,Node)
  23.     {
  24.         Count++;
  25.     }
  26.  
  27.     if(Group->Special.Group.Horizontal)
  28.     {
  29.         LONG Room = Width - Group->Width,Left,Width,i = 0;
  30.  
  31.         if(Count > 1)
  32.         {
  33.             Left = 0;
  34.  
  35.             Room += --Count * Handle->InterWidth;
  36.         }
  37.         else
  38.             Left = Room / 2;
  39.  
  40.         SCANGROUP(Group,Node)
  41.         {
  42.             if(!LIKE_STRING_KIND(Node) || Node->Special.String.LinkID == -1)
  43.             {
  44.                 Width = Node->Width;
  45.  
  46.                 switch(Node->LabelPlace)
  47.                 {
  48.                     case PLACE_LEFT:
  49.  
  50.                         if(Node->Type == MX_KIND)
  51.                         {
  52.                             Left += Node->Special.Radio.LabelWidth + INTERWIDTH;
  53.  
  54.                             if(Node->Label)
  55.                             {
  56.                                 if(Node->Special.Radio.TitlePlace == PLACETEXT_LEFT)
  57.                                     Left += Node->LabelWidth + INTERWIDTH;
  58.                                 else
  59.                                     Width += INTERWIDTH + Node->LabelWidth;
  60.                             }
  61.                         }
  62.                         else
  63.                             Left += Node->LabelWidth + INTERWIDTH;
  64.  
  65.                         break;
  66.  
  67.                     case PLACE_RIGHT:
  68.  
  69.                         if(Node->Type == MX_KIND)
  70.                         {
  71.                             Width += INTERWIDTH + Node->Special.Radio.LabelWidth;
  72.  
  73.                             if(Node->Label)
  74.                             {
  75.                                 if(Node->Special.Radio.TitlePlace == PLACETEXT_LEFT)
  76.                                     Left += Node->LabelWidth + INTERWIDTH;
  77.                                 else
  78.                                     Width += INTERWIDTH + Node->LabelWidth;
  79.                             }
  80.                         }
  81.                         else
  82.                             Width += INTERWIDTH + Node->LabelWidth;
  83.  
  84.                         break;
  85.                 }
  86.  
  87.                 if(Node->Type == LISTVIEW_KIND && Node->Special.List.ExtraLabelWidth)
  88.                     Left += Node->Special.List.ExtraLabelWidth + INTERWIDTH;
  89.  
  90.                 if(Node->Type == SLIDER_KIND)
  91.                 {
  92.                     if(Node->Special.Slider.LevelPlace == PLACETEXT_RIGHT)
  93.                         Width += INTERWIDTH + Node->Special.Slider.LevelWidth;
  94.  
  95.                     if(Node->Special.Slider.LevelPlace == PLACETEXT_LEFT && Node->LabelPlace != PLACE_LEFT)
  96.                         Left += INTERWIDTH + Node->Special.Slider.LevelWidth;
  97.                 }
  98.  
  99. #ifdef DO_LEVEL_KIND
  100.                 if(Node->Type == LEVEL_KIND)
  101.                 {
  102.                     if(Node->Special.Level.LevelPlace == PLACETEXT_RIGHT)
  103.                         Width += INTERWIDTH + Node->Special.Level.MaxLevelWidth;
  104.  
  105.                     if(Node->Special.Level.LevelPlace == PLACETEXT_LEFT && Node->LabelPlace != PLACE_LEFT)
  106.                         Left += INTERWIDTH + Node->Special.Level.MaxLevelWidth;
  107.                 }
  108. #endif    /* DO_LEVEL_KIND*/
  109.  
  110.                 Node->Left = Left;
  111.  
  112.                 Left += Width + ((Room * (i + 1)) / Count - (Room * i) / Count);
  113.  
  114.                 i++;
  115.             }
  116.         }
  117.     }
  118.     else
  119.     {
  120.         LONG Room = Height - Group->Height,Height,Top,y,i = 0;
  121.  
  122.         if(Count > 1)
  123.         {
  124.             Top = 0;
  125.  
  126.             Room += --Count * Handle->InterHeight;
  127.         }
  128.         else
  129.             Top = Room / 2;
  130.  
  131.         SCANGROUP(Group,Node)
  132.         {
  133.             if(!LIKE_STRING_KIND(Node) || Node->Special.String.LinkID == -1)
  134.             {
  135.                 if(Count++)
  136.                 {
  137.                     if(Node->ExtraSpace > 0)
  138.                         y = Top + Node->ExtraSpace * Handle->InterHeight;
  139.                     else
  140.                     {
  141.                         if(Node->ExtraSpace < 0)
  142.                             y = Top - Node->ExtraSpace;
  143.                         else
  144.                             y = Top + Handle->InterHeight;
  145.                     }
  146.                 }
  147.                 else
  148.                     y = Top;
  149.  
  150.                 if(Node->LabelPlace == PLACE_ABOVE)
  151.                     y += Handle->GlyphHeight + INTERHEIGHT;
  152.  
  153.                 Node->Top = y;
  154.  
  155.                 if(Node->LabelPlace == PLACE_BELOW && Node->Label)
  156.                     Height = Node->Height + INTERHEIGHT + Handle->GlyphHeight;
  157.                 else
  158.                     Height = Node->Height;
  159.  
  160.                 Top = y + Height + ((Room * (i + 1)) / Count - (Room * i) / Count);
  161.  
  162.                 i++;
  163.             }
  164.         }
  165.     }
  166. }
  167.